{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature Dimention Reduction Using LDA and PCA with Python | Principal Component Analysis in Feature Selection | KGP Talkie "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What is LDA (Linear Discriminant Analysis)? "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The idea behind LDA is simple. Mathematically speaking, we need to find a new feature space to project the data in order to maximize classes separability"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Linear Discriminant Analysis is a supervised algorithm as it takes the class label into consideration. It is a way to reduce ‘dimensionality’ while at the same time preserving as much of the class discrimination information as possible.\n",
    "\n",
    "LDA helps you find the boundaries around clusters of classes. It projects your data points on a line so that your clusters are as separated as possible, with each cluster having a relative (close) distance to a centroid.\n",
    "\n",
    "So the question arises- how are these clusters are defined and how do we get the reduced feature set in case of LDA?\n",
    "\n",
    "Basically LDA finds a centroid of each class datapoints. For example with thirteen different features LDA will find the centroid of each of its class using the thirteen different feature dataset. Now on the basis of this, it determines a new dimension which is nothing but an axis which should satisfy two criteria:\n",
    "1.\tMaximize the distance between the centroid of each class.\n",
    "2.\tMinimize the variation (which LDA calls scatter and is represented by s2), within each category."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What is PCA "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Principal Component Analysis (PCA) is a linear dimensionality reduction technique that can be utilized for extracting information from a high-dimensional space by projecting it into a lower-dimensional sub-space. It tries to preserve the essential parts that have more variation of the data and remove the non-essential parts with fewer variation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dimensions are nothing but features that represent the data. For example, A 28 X 28 image has 784 picture elements (pixels) that are the dimensions or features which together represent that image."
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAABIAAAAGwCAYAAADR6h5QAAAgAElEQVR4AezdCXxdZZ34/+9NmuQmTdKkbdrSLd0ILSAVUFlbSkvLVrpQqqAsan+jjqMyOIyKqAOOKKLjDg7+mdEXqDACXaAUhLa0VhTZpJWtKSkt3WjTNG2W3uz5v75PODc3J3c5d7/33M95vfDe5yzPeZ73c815+j3PeY6nt7e3V1gQQAABBBBAAAEEEEAAAQQQQAABBFwrkOfamlExBBBAAAEEEEAAAQQQQAABBBBAAAEjQACIHwICCCCAAAIIIIAAAggggAACCCDgcgECQC5vYKqHAAIIIIAAAggggAACCCCAAAIIEADiN4AAAggggAACCCCAAAIIIIAAAgi4XIAAkMsbmOohgAACCCCAAAIIIIAAAggggAACBID4DSCAAAIIIIAAAggggAACCCCAAAIuFyAA5PIGpnoIIIAAAggggAACCCCAAAIIIIAAASB+AwgggAACCCCAAAIIIIAAAggggIDLBQgAubyBqR4CCCCAAAIIIIAAAggggAACCCBAAIjfAAIIIIAAAggggAACCCCAAAIIIOByAQJALm9gqocAAggggAACCCCAAAIIIIAAAggQAOI3gAACCCCAAAIIIIAAAggggAACCLhcgACQyxuY6iGAAAIIIIAAAggggAACCCCAAAIEgPgNIIAAAggggAACCCCAAAIIIIAAAi4XIADk8gameggggAACCCCAAAIIIIAAAggggAABIH4DCCCAAAIIIIAAAggggAACCCCAgMsFCAC5vIGpHgIIIIAAAggggAACCCCAAAIIIEAAiN8AAggggAACCCCAAAIIIIAAAggg4HIBAkAub2CqhwACCCCAAAIIIIAAAggggAACCBAA4jeAAAIIIIAAAggggAACCCCAAAIIuFyAAJDLG5jqIYAAAggggAACCCCAAAIIIIAAAgSA+A0ggAACCCCAAAIIIIAAAggggAACLhcgAOTyBqZ6CCCAAAIIIIAAAggggAACCCCAAAEgfgMIIIAAAggggAACCCCAAAIIIICAywUIALm8gakeAggggAACCCCAAAIIIIAAAgggQACI3wACCCCAAAIIIIAAAggggAACCCDgcgECQC5vYKqHAAIIIIAAAggggAACCCCAAAIIEADiN4AAAggggAACCCCAAAIIIIAAAgi4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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One important thing to note about PCA is that it is an Unsupervised dimensionality reduction technique, you can cluster the similar data points based on the feature correlation between them without any supervision (or labels), and you will learn how to achieve this practically using Python in later sections of this tutorial!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "According to Wikipedia, PCA is a statistical procedure that uses an orthogonal transformation to convert a set of observations of possibly correlated variables (entities each of which takes on various numerical values) into a set of values of linearly uncorrelated variables called principal components."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## When to use PCA "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Data Visualization: When working on any data related problem, the challenge in today's world is the sheer volume of data, and the variables/features that define that data. To solve a problem where data is the key, you need extensive data exploration like finding out how the variables are correlated or understanding the distribution of a few variables. Considering that there are a large number of variables or dimensions along which the data is distributed, visualization can be a challenge and almost impossible."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Speeding Machine Learning (ML) Algorithm: Since PCA's main idea is dimensionality reduction, you can leverage that to speed up your machine learning algorithm's training and testing time considering your data has a lot of features, and the ML algorithm's learning is too slow."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## How to do PCA "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can calculate a Principal Component Analysis on a dataset using the PCA() class in the scikit-learn library. The benefit of this approach is that once the projection is calculated, it can be applied to new data again and again quite easily.\n",
    "\n",
    "When creating the class, the number of components can be specified as a parameter.\n",
    "\n",
    "The class is first fit on a dataset by calling the fit() function, and then the original dataset or other data can be projected into a subspace with the chosen number of dimensions by calling the transform() function.\n",
    "\n",
    "Once fit, the eigenvalues and principal components can be accessed on the PCA class via the explained_variance_ and components_ attributes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score, roc_auc_score\n",
    "from sklearn.feature_selection import VarianceThreshold\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>var3</th>\n",
       "      <th>var15</th>\n",
       "      <th>imp_ent_var16_ult1</th>\n",
       "      <th>imp_op_var39_comer_ult1</th>\n",
       "      <th>imp_op_var39_comer_ult3</th>\n",
       "      <th>imp_op_var40_comer_ult1</th>\n",
       "      <th>imp_op_var40_comer_ult3</th>\n",
       "      <th>imp_op_var40_efect_ult1</th>\n",
       "      <th>imp_op_var40_efect_ult3</th>\n",
       "      <th>...</th>\n",
       "      <th>saldo_medio_var33_hace2</th>\n",
       "      <th>saldo_medio_var33_hace3</th>\n",
       "      <th>saldo_medio_var33_ult1</th>\n",
       "      <th>saldo_medio_var33_ult3</th>\n",
       "      <th>saldo_medio_var44_hace2</th>\n",
       "      <th>saldo_medio_var44_hace3</th>\n",
       "      <th>saldo_medio_var44_ult1</th>\n",
       "      <th>saldo_medio_var44_ult3</th>\n",
       "      <th>var38</th>\n",
       "      <th>TARGET</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>23</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39205.170000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>34</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>49278.030000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>23</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>67333.770000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>2</td>\n",
       "      <td>37</td>\n",
       "      <td>0.0</td>\n",
       "      <td>195.0</td>\n",
       "      <td>195.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>64007.970000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>10</td>\n",
       "      <td>2</td>\n",
       "      <td>39</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>117310.979016</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 371 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID  var3  var15  imp_ent_var16_ult1  imp_op_var39_comer_ult1  \\\n",
       "0   1     2     23                 0.0                      0.0   \n",
       "1   3     2     34                 0.0                      0.0   \n",
       "2   4     2     23                 0.0                      0.0   \n",
       "3   8     2     37                 0.0                    195.0   \n",
       "4  10     2     39                 0.0                      0.0   \n",
       "\n",
       "   imp_op_var39_comer_ult3  imp_op_var40_comer_ult1  imp_op_var40_comer_ult3  \\\n",
       "0                      0.0                      0.0                      0.0   \n",
       "1                      0.0                      0.0                      0.0   \n",
       "2                      0.0                      0.0                      0.0   \n",
       "3                    195.0                      0.0                      0.0   \n",
       "4                      0.0                      0.0                      0.0   \n",
       "\n",
       "   imp_op_var40_efect_ult1  imp_op_var40_efect_ult3  ...  \\\n",
       "0                        0                        0  ...   \n",
       "1                        0                        0  ...   \n",
       "2                        0                        0  ...   \n",
       "3                        0                        0  ...   \n",
       "4                        0                        0  ...   \n",
       "\n",
       "   saldo_medio_var33_hace2  saldo_medio_var33_hace3  saldo_medio_var33_ult1  \\\n",
       "0                      0.0                      0.0                     0.0   \n",
       "1                      0.0                      0.0                     0.0   \n",
       "2                      0.0                      0.0                     0.0   \n",
       "3                      0.0                      0.0                     0.0   \n",
       "4                      0.0                      0.0                     0.0   \n",
       "\n",
       "   saldo_medio_var33_ult3  saldo_medio_var44_hace2  saldo_medio_var44_hace3  \\\n",
       "0                     0.0                      0.0                      0.0   \n",
       "1                     0.0                      0.0                      0.0   \n",
       "2                     0.0                      0.0                      0.0   \n",
       "3                     0.0                      0.0                      0.0   \n",
       "4                     0.0                      0.0                      0.0   \n",
       "\n",
       "   saldo_medio_var44_ult1  saldo_medio_var44_ult3          var38  TARGET  \n",
       "0                     0.0                     0.0   39205.170000       0  \n",
       "1                     0.0                     0.0   49278.030000       0  \n",
       "2                     0.0                     0.0   67333.770000       0  \n",
       "3                     0.0                     0.0   64007.970000       0  \n",
       "4                     0.0                     0.0  117310.979016       0  \n",
       "\n",
       "[5 rows x 371 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('santander.csv', nrows = 20000)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((20000, 370), (20000,))"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = data.drop('TARGET', axis = 1)\n",
    "y = data['TARGET']\n",
    "\n",
    "X.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0, stratify = y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Remove Constant, Quasi Constant and Duplicate Features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "#remove constant and quasi constant features\n",
    "constant_filter = VarianceThreshold(threshold=0.01)\n",
    "constant_filter.fit(X_train)\n",
    "X_train_filter = constant_filter.transform(X_train)\n",
    "X_test_filter = constant_filter.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((16000, 245), (4000, 245))"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_filter.shape, X_test_filter.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#remove duplicate features\n",
    "X_train_T = X_train_filter.T\n",
    "X_test_T = X_test_filter.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_T = pd.DataFrame(X_train_T)\n",
    "X_test_T = pd.DataFrame(X_test_T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_T.duplicated().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "duplicated_features = X_train_T.duplicated()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "features_to_keep = [not index for index in duplicated_features]\n",
    "\n",
    "X_train_unique = X_train_T[features_to_keep].T\n",
    "X_test_unique = X_test_T[features_to_keep].T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler().fit(X_train_unique)\n",
    "X_train_unique = scaler.transform(X_train_unique)\n",
    "X_test_unique = scaler.transform(X_test_unique)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_unique = pd.DataFrame(X_train_unique)\n",
    "X_test_unique = pd.DataFrame(X_test_unique)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((16000, 227), (4000, 227))"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_unique.shape, X_test_unique.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Removal of correlated Feature "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "corrmat = X_train_unique.corr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "correlated features:  148\n"
     ]
    }
   ],
   "source": [
    "#find correlated features\n",
    "def get_correlation(data, threshold):\n",
    "    corr_col = set()\n",
    "    corrmat = data.corr()\n",
    "    for i in range(len(corrmat.columns)):\n",
    "        for j in range(i):\n",
    "            if abs(corrmat.iloc[i, j]) > threshold:\n",
    "                colname = corrmat.columns[i]\n",
    "                corr_col.add(colname)\n",
    "    return corr_col\n",
    "\n",
    "corr_features = get_correlation(X_train_unique, 0.70)\n",
    "print('correlated features: ', len(set(corr_features)) )    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_uncorr = X_train_unique.drop(labels=corr_features, axis = 1)\n",
    "X_test_uncorr = X_test_unique.drop(labels = corr_features, axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((16000, 79), (4000, 79))"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_uncorr.shape, X_test_uncorr.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature Dimention Reduction by LDA or Is it a Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "lda = LDA(n_components=1)\n",
    "X_train_lda = lda.fit_transform(X_train_uncorr, y_train)\n",
    "X_test_lda = lda.transform(X_test_uncorr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((16000, 1), (4000, 1))"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_lda.shape, X_test_lda.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_randomForest(X_train, X_test, y_train, y_test):\n",
    "    clf = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)\n",
    "    clf.fit(X_train, y_train)\n",
    "    y_pred = clf.predict(X_test)\n",
    "    print('Accuracy on test set: ')\n",
    "    print(accuracy_score(y_test, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on test set: \n",
      "0.93025\n",
      "CPU times: user 3.35 s, sys: 64.3 ms, total: 3.41 s\n",
      "Wall time: 1.1 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "run_randomForest(X_train_lda, X_test_lda, y_train, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on test set: \n",
      "0.9585\n",
      "CPU times: user 3.41 s, sys: 82 ms, total: 3.49 s\n",
      "Wall time: 1.2 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "run_randomForest(X_train_uncorr, X_test_uncorr, y_train, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on test set: \n",
      "0.9585\n",
      "CPU times: user 6.68 s, sys: 143 ms, total: 6.83 s\n",
      "Wall time: 2.01 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "run_randomForest(X_train, X_test, y_train, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature Reduction by PCA? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=2, random_state=42,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=2, random_state=42)\n",
    "pca.fit(X_train_uncorr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((16000, 2), (4000, 2))"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_pca = pca.transform(X_train_uncorr)\n",
    "X_test_pca = pca.transform(X_test_uncorr)\n",
    "X_train_pca.shape, X_test_pca.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on test set: \n",
      "0.956\n",
      "CPU times: user 3.06 s, sys: 67.9 ms, total: 3.12 s\n",
      "Wall time: 999 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "run_randomForest(X_train_pca, X_test_pca, y_train, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on test set: \n",
      "0.9585\n",
      "CPU times: user 6.75 s, sys: 138 ms, total: 6.89 s\n",
      "Wall time: 2.13 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "run_randomForest(X_train, X_test, y_train, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(16000, 79)"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_uncorr.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected Components:  1\n",
      "Accuracy on test set: \n",
      "0.92375\n",
      "\n",
      "Selected Components:  2\n",
      "Accuracy on test set: \n",
      "0.956\n",
      "\n",
      "Selected Components:  3\n",
      "Accuracy on test set: \n",
      "0.95675\n",
      "\n",
      "Selected Components:  4\n",
      "Accuracy on test set: \n",
      "0.95825\n",
      "\n",
      "Selected Components:  5\n"
     ]
    }
   ],
   "source": [
    "for component in range(1,30):\n",
    "    pca = PCA(n_components=component, random_state=42)\n",
    "    pca.fit(X_train_uncorr)\n",
    "    X_train_pca = pca.transform(X_train_uncorr)\n",
    "    X_test_pca = pca.transform(X_test_uncorr)\n",
    "    print('Selected Components: ', component)\n",
    "    run_randomForest(X_train_pca, X_test_pca, y_train, y_test)\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
